package raft

import (
	"errors"
	"strconv"
	"strings"
	"xin/raft/lifecycle"
	"xin/raft/pb"
)

type Endpoint string // 端点描述 127.0.0.1:8080

func (e Endpoint) Ip() (string, error) {
	ss := strings.Split(string(e), ":")
	if len(ss) != 2 {
		return "", errors.New("invalid endpoint")
	}
	return ss[0], nil
}

func (e Endpoint) Port() (int, error) {
	ss := strings.Split(string(e), ":")
	if len(ss) != 2 {
		return 0, errors.New("invalid endpoint")
	}

	return strconv.Atoi(ss[1])
}

func (e Endpoint) String() string {
	return string(e)
}

type RPCReq struct {
	Command  any            // pb.RequestVote / pb.AppendEntries
	RespChan chan<- RPCResp // RPC 请求被处理后的返回结果。RPC 实现类，监听并通过网络传输
}
type RPCResp struct {
	Resp any // pb.RequestVoteResp pb.AppendEntriesResp
	Err  error
}

// Transport 网络通信接口
type Transport interface {
	lifecycle.LifeCycle

	// RequestVote 发送请求投票
	RequestVote(req *pb.RequestVote, endpoint Endpoint, resp *pb.RequestVoteResp) error

	// AppendEntries 发送日志条目
	AppendEntries(req *pb.AppendEntries, endpoint Endpoint, resp *pb.AppendEntriesResp) error

	// Consumer 节点接收其他节点的 RPC 请求
	// 当前节点是跟随者；收到心跳；收到日志复制；收到投票请求等等
	Consumer() chan *RPCReq
}
